package com.hb.util;

import com.hb.commons.MsgEnum;
import com.hb.commons.ResponseDto;

/**
 * 基础公共Controller
 *
 * @author zhaojk
 */
public class ResultUtil {
    /**
     * 响应对象变种人始祖
     */
    private static final ResponseDto PROTO = new ResponseDto();

    /**
     * 成功消息常量
     *
     * @since 1.0
     */
    public static final ResponseDto SUCCESS = msg(200);

    /**
     * 失败消息常量
     *
     * @since 1.0
     */
    public static final ResponseDto FAIL = msg(0);

    /**
     * 根据boolean变量获取响应消息
     *
     * @param flag boolean
     * @return JSONObject
     */
    public static ResponseDto msg(boolean flag) {
        if (flag)
            return SUCCESS;
        return FAIL;
    }

    /**
     * 根据布尔值变量指定响应消息
     *
     * @param flag boolean
     * @param data 数据对象
     * @return JSONObject
     */
    public static ResponseDto msg(boolean flag, Object data) {
        return msg(flag ? 200 : 0, data);
    }

    /**
     * 根据状态码
     *
     * @param code 状态码
     * @return JSONObject
     */
    public static ResponseDto msg(int code) {
        return msg(code, null);
    }

    /**
     * 根据状态码
     *
     * @param code 状态码
     * @param data 数据对象
     * @return
     */
    public static ResponseDto msg(int code, Object data) {
        MsgEnum m = MsgEnum.codeOf(code);
        return msg(m, data);
    }

    /**
     * 根据枚举类型
     *
     * @param msgEnum com.util.entity.MsgEnum
     * @return JSONObject
     * @see MsgEnum
     */
    public static ResponseDto msg(MsgEnum msgEnum) {
        return msg(msgEnum, null);
    }

    /**
     * 根据枚举类型
     *
     * @param msgEnum com.util.entity.MsgEnum
     * @param data    数据对象
     * @return
     * @see MsgEnum
     */
    public static ResponseDto msg(MsgEnum msgEnum, Object data) {
        return msg(true, msgEnum.code(), msgEnum.msg(), data);
    }

    /**
     * 根据布尔值变量, 指定消息以及返回数据
     *
     * @param flag       boolean
     * @param statusCode 状态码
     * @param message    String
     * @param data       数据对象
     * @return JSONObject
     */
    public static ResponseDto msg(boolean flag, int statusCode, String message, Object data) {
        ResponseDto responseDto = PROTO.getInstance(); // JDK提供的原型模式, 高并发时效率杠杠的
        responseDto.setSuccess(flag);
        responseDto.setStatus(statusCode);
        responseDto.setMessage(message == null ? "" : message);
        if (data != null) {
            responseDto.setData(data);
        }
        return responseDto;
    }

    /**
     * 成功返回的方法
     *
     * @param message 自定义的消息
     * @return
     */
    public static ResponseDto success(String message) {
        return success(message, null);
    }

    /**
     * 成功返回的方法
     *
     * @param message 自定义的消息
     * @param data    数据对象
     * @return
     */
    public static ResponseDto success(String message, Object data) {
        return msg(true, 200, message, data);
    }

    /**
     * 失败返回的方法
     *
     * @param message 自定义的消息
     * @return
     */
    public static ResponseDto fail(String message) {
        return msg(true, 0, message, null);
    }

    public static ResponseDto fail(MsgEnum msgEnum) {
        return msg(true, msgEnum.code(), msgEnum.msg(), null);
    }

    /**
     * 后台异常报错
     *
     * @param message
     * @return
     * @see MsgEnum
     */
    public static ResponseDto error(String message) {
        return msg(false, 500, message, null);
    }

}
